// 文档导入工具
import type { 
  DocImportConfig, 
  DocImportTask, 
  DocLesson, 
  DocCategory,
  DocTag,
  DocMappingRule 
} from '@/types/docs'
import { http } from './http'

// Cursor 文档结构映射
const CURSOR_DOC_STRUCTURE = {
  '快速入门': {
    slug: 'getting-started',
    sortOrder: 1,
    children: [
      { name: '简介', slug: 'introduction' },
      { name: '安装', slug: 'installation' },
      { name: '常见问题', slug: 'faq' }
    ]
  },
  '使用手册': {
    slug: 'user-guide',
    sortOrder: 2,
    children: [
      {
        name: '编辑器迁移',
        slug: 'editor-migration',
        children: [
          { name: '从 VS Code 迁移', slug: 'from-vscode' },
          { name: '从 JetBrains IDE 迁移', slug: 'from-jetbrains' }
        ]
      },
      {
        name: '支持的语言与框架',
        slug: 'supported-languages',
        children: [
          { name: 'JavaScript 与 TypeScript', slug: 'javascript-typescript' },
          { name: 'iOS 与 macOS（Swift）', slug: 'ios-macos-swift' },
          { name: 'Java', slug: 'java' }
        ]
      }
    ]
  },
  '编辑器': {
    slug: 'editor',
    sortOrder: 3,
    children: [
      { name: 'AI 生成提交信息', slug: 'ai-commit-messages' },
      { name: '记事本功能（Beta）', slug: 'notepad' },
      { name: '键盘快捷键', slug: 'keyboard-shortcuts' },
      { name: '标签页管理', slug: 'tab-management' },
      { name: '智能会话 (Chat)', slug: 'chat' },
      { name: '⌘K', slug: 'cmd-k' }
    ]
  },
  '上下文管理': {
    slug: 'context-management',
    sortOrder: 4,
    children: [
      { name: '代码库索引', slug: 'codebase-indexing' },
      { name: 'AI 行为规则', slug: 'ai-rules' },
      { name: '忽略文件配置', slug: 'ignore-files' },
      { name: '上下文协议', slug: 'context-protocol' },
      { name: '@ Symbols', slug: 'at-symbols' }
    ]
  },
  '账户': {
    slug: 'account',
    sortOrder: 5,
    children: [
      { name: '套餐与用量', slug: 'plans-usage' },
      { name: '数据看板', slug: 'dashboard' },
      { name: '账单管理', slug: 'billing' },
      { name: '商业版', slug: 'business' }
    ]
  },
  '设置': {
    slug: 'settings',
    sortOrder: 6,
    children: [
      { name: '模型管理', slug: 'model-management' },
      { name: '自定义 API 密钥', slug: 'custom-api-keys' },
      { name: '早期体验计划', slug: 'early-access' }
    ]
  },
  '故障排除': {
    slug: 'troubleshooting',
    sortOrder: 7,
    children: [
      { name: '常见问题', slug: 'common-issues' },
      { name: '故障排除指南', slug: 'troubleshooting-guide' },
      { name: '获取请求 ID', slug: 'request-id' }
    ]
  }
}

// 文档导入类
export class DocImporter {
  private config: DocImportConfig
  private task: DocImportTask | null = null
  private categoryMap: Map<string, number> = new Map()
  private tagMap: Map<string, number> = new Map()

  constructor(config: DocImportConfig) {
    this.config = {
      delay: 2000,
      batchSize: 10,
      imageDownload: true,
      imagePrefix: 'cursor-docs',
      ...config
    }
  }

  // 开始导入任务
  async startImport(): Promise<DocImportTask> {
    try {
      // 创建导入任务
      this.task = {
        source: this.config.source,
        status: 'running',
        totalPages: 0,
        processedPages: 0,
        startedAt: new Date().toISOString(),
        logs: []
      }

      this.log('info', '开始导入 Cursor 文档...')

      // 1. 创建分类结构
      await this.createCategories()

      // 2. 导入文档内容
      await this.importDocuments()

      // 3. 完成任务
      this.task.status = 'completed'
      this.task.completedAt = new Date().toISOString()
      this.log('info', '文档导入完成！')

      return this.task
    } catch (error) {
      this.task!.status = 'failed'
      this.task!.error = error instanceof Error ? error.message : '未知错误'
      this.log('error', '导入失败', error)
      throw error
    }
  }

  // 创建分类结构
  private async createCategories() {
    this.log('info', '创建分类结构...')

    // 创建根分类
    const rootCategory = await this.createCategory({
      name: 'Cursor 文档',
      slug: 'cursor-docs',
      description: 'Cursor 官方文档中文版',
      isDocCategory: true,
      docSource: 'cursor',
      sortOrder: 0
    })

    const rootId = rootCategory.id

    // 创建一级分类
    for (const [name, info] of Object.entries(CURSOR_DOC_STRUCTURE)) {
      const category = await this.createCategory({
        name,
        slug: info.slug,
        parentId: rootId,
        isDocCategory: true,
        docSource: 'cursor',
        sortOrder: info.sortOrder
      })

      this.categoryMap.set(info.slug, category.id)

      // 创建二级分类
      if (info.children) {
        for (const child of info.children) {
          await this.createSubCategories(child, category.id)
        }
      }
    }

    this.log('info', `分类结构创建完成，共创建 ${this.categoryMap.size} 个分类`)
  }

  // 递归创建子分类
  private async createSubCategories(node: any, parentId: number) {
    const category = await this.createCategory({
      name: node.name,
      slug: node.slug,
      parentId,
      isDocCategory: true,
      docSource: 'cursor',
      sortOrder: 0
    })

    this.categoryMap.set(node.slug, category.id)

    if (node.children) {
      for (const child of node.children) {
        await this.createSubCategories(child, category.id)
      }
    }
  }

  // 创建单个分类
  private async createCategory(data: Partial<DocCategory>): Promise<DocCategory> {
    try {
      const response = await http.post('/api/docs/categories', data)
      return response.data
    } catch (error) {
      this.log('error', `创建分类失败: ${data.name}`, error)
      throw error
    }
  }

  // 导入文档内容
  private async importDocuments() {
    this.log('info', '开始导入文档内容...')

    // 模拟文档数据（实际应该从网站爬取）
    const sampleDocs = [
      {
        categorySlug: 'introduction',
        title: 'Cursor 简介',
        content: this.getSampleContent('introduction'),
        difficulty: 'beginner' as const,
        tags: ['入门', 'AI编程', 'Cursor基础']
      },
      {
        categorySlug: 'installation',
        title: 'Cursor 安装指南',
        content: this.getSampleContent('installation'),
        difficulty: 'beginner' as const,
        tags: ['安装', '配置', 'Windows', 'Mac', 'Linux']
      },
      {
        categorySlug: 'from-vscode',
        title: '从 VS Code 迁移到 Cursor',
        content: this.getSampleContent('vscode-migration'),
        difficulty: 'intermediate' as const,
        tags: ['VS Code', '迁移', '编辑器']
      },
      {
        categorySlug: 'chat',
        title: 'Cursor Chat 功能详解',
        content: this.getSampleContent('chat'),
        difficulty: 'intermediate' as const,
        tags: ['Chat', 'AI对话', '代码生成']
      },
      {
        categorySlug: 'cmd-k',
        title: '⌘K 快捷命令使用指南',
        content: this.getSampleContent('cmd-k'),
        difficulty: 'intermediate' as const,
        tags: ['快捷键', '命令', '效率']
      }
    ]

    // 批量导入文档
    for (const docData of sampleDocs) {
      await this.importSingleDocument(docData)
      await this.delay(this.config.delay || 1000)
    }

    this.log('info', `文档导入完成，共导入 ${sampleDocs.length} 篇文档`)
  }

  // 导入单个文档
  private async importSingleDocument(docData: any) {
    try {
      const categoryId = this.categoryMap.get(docData.categorySlug)
      if (!categoryId) {
        throw new Error(`未找到分类: ${docData.categorySlug}`)
      }

      // 创建或获取标签
      const tagIds = await this.getOrCreateTags(docData.tags)

      // 创建文档
      const lesson: Partial<DocLesson> = {
        title: docData.title,
        content: docData.content,
        excerpt: this.extractExcerpt(docData.content),
        categoryId,
        difficulty: docData.difficulty,
        contentType: 'documentation',
        source: {
          name: 'Cursor 官方文档',
          url: 'https://cursor-docs.apifox.cn/',
          version: '1.0',
          language: 'zh-CN'
        },
        isPublished: true,
        sortOrder: 0,
        viewCount: 0
      }

      const response = await http.post('/api/docs/lessons', lesson)
      const lessonId = response.data.id

      // 关联标签
      if (tagIds.length > 0) {
        await http.post(`/api/docs/lessons/${lessonId}/tags`, { tagIds })
      }

      this.log('info', `成功导入文档: ${docData.title}`)
    } catch (error) {
      this.log('error', `导入文档失败: ${docData.title}`, error)
    }
  }

  // 获取或创建标签
  private async getOrCreateTags(tagNames: string[]): Promise<number[]> {
    const tagIds: number[] = []

    for (const name of tagNames) {
      let tagId = this.tagMap.get(name)
      
      if (!tagId) {
        try {
          const response = await http.post('/api/docs/tags', {
            name,
            slug: this.slugify(name),
            type: this.getTagType(name)
          })
          tagId = response.data.id
          if (tagId) {
            this.tagMap.set(name, tagId)
          }
        } catch (error) {
          this.log('warning', `创建标签失败: ${name}`)
          continue
        }
      }

      if (tagId) {
        tagIds.push(tagId)
      }
    }

    return tagIds
  }

  // 判断标签类型
  private getTagType(name: string): string {
    if (['Windows', 'Mac', 'Linux'].includes(name)) return 'platform'
    if (['JavaScript', 'TypeScript', 'Java', 'Swift'].includes(name)) return 'language'
    if (['Tab', 'Chat', 'Agent', '快捷键'].includes(name)) return 'feature'
    return 'general'
  }

  // 提取摘要
  private extractExcerpt(content: string, maxLength = 200): string {
    const plainText = content
      .replace(/[#*`\[\]()]/g, '')
      .replace(/\n+/g, ' ')
      .trim()
    
    return plainText.length > maxLength
      ? plainText.substring(0, maxLength) + '...'
      : plainText
  }

  // 生成 slug
  private slugify(text: string): string {
    return text
      .toLowerCase()
      .replace(/[^\w\u4e00-\u9fa5]+/g, '-')
      .replace(/^-+|-+$/g, '')
  }

  // 延迟函数
  private delay(ms: number): Promise<void> {
    return new Promise(resolve => setTimeout(resolve, ms))
  }

  // 记录日志
  private log(level: 'info' | 'warning' | 'error', message: string, details?: any) {
    const log = {
      timestamp: new Date().toISOString(),
      level,
      message,
      details
    }

    if (this.task) {
      this.task.logs = this.task.logs || []
      this.task.logs.push(log)
    }

    console.log(`[${level.toUpperCase()}] ${message}`, details || '')
  }

  // 获取示例内容（实际应该从网站爬取）
  private getSampleContent(type: string): string {
    const contents: Record<string, string> = {
      introduction: `# Cursor 简介

Cursor 是一款强大的 AI 优先的代码编辑器，可以增强您的开发工作流程。

## 核心功能

### Tab 补全
按 Tab 键进行智能代码补全，它了解您的代码库并提供上下文相关的建议。

### Chat 对话
使用 ⌘I 打开统一的 AI 界面，支持提问（Ask）、编辑（Edit）和代理（Agent）模式。

### ⌘K 命令
使用 Cmd/Ctrl + K 进行内联代码编辑。

## 为什么选择 Cursor？

1. **智能代码补全** - 基于上下文的智能建议
2. **AI 对话编程** - 自然语言描述需求
3. **代码重构** - 智能重构和优化建议
4. **多语言支持** - 支持所有主流编程语言`,

      installation: `# Cursor 安装指南

## 系统要求

### Windows
- Windows 10 或更高版本
- 至少 4GB RAM（推荐 8GB）

### macOS
- macOS 10.15 或更高版本
- Apple Silicon 或 Intel 处理器

### Linux
- Ubuntu 18.04+, Fedora 30+, 或其他主流发行版
- 至少 4GB RAM

## 安装步骤

### 1. 下载安装包
访问 [Cursor 官网](https://cursor.sh) 下载对应系统的安装包。

### 2. 安装
- **Windows**: 双击 .exe 文件，按照安装向导操作
- **macOS**: 双击 .dmg 文件，将 Cursor 拖入应用程序文件夹
- **Linux**: 使用包管理器或 AppImage

### 3. 首次启动
启动 Cursor 后，会提示您登录账号或创建新账号。`,

      'vscode-migration': `# 从 VS Code 迁移到 Cursor

## 迁移步骤

### 1. 导入设置
Cursor 可以自动导入您的 VS Code 设置：
- 打开 Cursor
- 选择 File > Import VS Code Settings
- 选择要导入的配置项

### 2. 安装扩展
大部分 VS Code 扩展都兼容 Cursor：
- 打开扩展面板（Cmd/Ctrl + Shift + X）
- 搜索并安装您常用的扩展

### 3. 快捷键
Cursor 保留了 VS Code 的快捷键，并新增了 AI 相关快捷键：
- ⌘K - AI 命令
- ⌘I - 打开 Chat
- Tab - 智能补全

## 主要区别

1. **AI 功能** - Cursor 内置强大的 AI 功能
2. **性能优化** - 针对 AI 操作进行了优化
3. **界面调整** - 新增 AI 相关面板`,

      chat: `# Cursor Chat 功能详解

## 什么是 Chat？

Chat 是 Cursor 的核心 AI 功能，提供三种模式：

### Agent 模式（默认）
- 进行代码库范围的更改
- 实现新功能
- 调试复杂问题
- 生成测试和文档

### Ask 模式
- 询问代码相关问题
- 获取函数解释
- 查找代码示例

### Edit 模式
- 直接编辑当前文件
- 重构代码
- 修复错误

## 使用方法

1. 按 ⌘I 打开 Chat 面板
2. 选择合适的模式
3. 输入您的需求
4. AI 会生成代码或回答问题

## 高级技巧

### 使用 @ 符号
- @files - 引用特定文件
- @folders - 引用文件夹
- @web - 搜索网络资源`,

      'cmd-k': `# ⌘K 快捷命令使用指南

## 基础用法

按下 Cmd/Ctrl + K 在当前位置激活 AI 命令：

### 生成代码
\`\`\`
// 按 ⌘K，输入：生成一个排序函数
function sortArray(arr) {
  return arr.sort((a, b) => a - b);
}
\`\`\`

### 修改代码
选中代码后按 ⌘K，描述修改需求

### 添加注释
将光标放在函数上，⌘K 输入"添加详细注释"

## 常用命令

1. **重构代码** - "将这个函数改为 async/await"
2. **添加错误处理** - "添加 try-catch 错误处理"
3. **优化性能** - "优化这段代码的性能"
4. **生成测试** - "为这个函数生成单元测试"

## 提示技巧

- 描述要具体明确
- 可以引用变量名和函数名
- 支持多语言描述`
    }

    return contents[type] || '# 文档内容\n\n这是一个示例文档。'
  }
}

// 导出便捷函数
export async function importCursorDocs(config?: Partial<DocImportConfig>) {
  const importer = new DocImporter({
    source: 'cursor',
    baseUrl: 'https://cursor-docs.apifox.cn/',
    selectors: {
      title: 'h1',
      content: '.content',
      navigation: '.nav',
      code: 'pre code'
    },
    ...config
  })

  return await importer.startImport()
} 